package com.opensms.mo.ms;

import java.io.IOException;
import java.sql.Timestamp;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import javax.mail.Message;
import javax.mail.MessagingException;

import com.opensms.mo.SMSVO;
import com.util.configuration.ConfigurationParametersManager;
import com.util.configuration.MissingConfigurationParameterException;
import com.util.exceptions.NoMatchException;

/**
 * Singleton
 * Parsea el contenido del mensaje del correo (javax.mail.Message) para crear un SMSVO
 * 
 * Necesita los siguientes parametros de configuracion:
 *  - MailtoSMS/patronMail: expresion regular que debe cumplir el contenido del mesage de correo  
 *  - MailtoSMS/posMovil: numero de grupo de la expresion regular de patronMail 
 *  	que representa el numero de telefono movil del sms 
 *  - MailtoSMS/posTxt: numero de grupo de la expresion regular de patronMail 
 *  	que representa el texto del sms
 */
public class MailToSMS {
	protected static final Log log = LogFactory.getLog(MailToSMS.class);

	private String patron;
	private int posMovil;
	private int posTxt;
	private Pattern p;
	
	private static MailToSMS instance = null;
	
	private MailToSMS(){
		//valores por defecto
		String patronConf =""; 
			//"Movil:([0-9]+)\\s+Texto:((.*))\\s+?";

		int posMovilConfInt  = 1;
		int posTxtConfInt  = 2;

		//Obtener el parametros de configuracion
		try {
			patronConf = ConfigurationParametersManager.getParameter("MailtoSMS/patronMail");
			String posMovilConf = ConfigurationParametersManager.getParameter("MailtoSMS/posMovil");
			posMovilConfInt = Integer.valueOf(posMovilConf);
			String posTxtConf = ConfigurationParametersManager.getParameter("MailtoSMS/posTxt");
			posTxtConfInt = Integer.valueOf(posTxtConf);
		} catch (MissingConfigurationParameterException e) {
			log.warn("Configuracion incompleta, usando valores por defecto: " + e.getMessage());
		}
		this.patron = patronConf;
		this.posMovil = posMovilConfInt;
		this.posTxt = posTxtConfInt;
		
		//inicializar el Pattern
		p = Pattern.compile(patron);
	}

	//	 creador sincronizado para protegerse de posibles problemas  multi-hilo
	private synchronized static void createInstance() {
        if (instance == null) { 
        	instance = new MailToSMS();
        }
    }
	
	public static MailToSMS getInstance(){
		if (instance==null) createInstance();
		return instance;
	}
	
	public SMSVO toSMS(Message msg)
		throws NoMatchException{

		try{
			//parsear txt mail con patron
			Matcher m = p.matcher(msg.getContent().toString());
			if (m.find()){
				String movil = m.group(posMovil);
				String texto = m.group(posTxt);
				log.debug("--- Fecha Mail (" + texto +") "+ msg.getSentDate());
				SMSVO rdo = new SMSVO(movil, new Timestamp(msg.getSentDate().getTime()), texto);
				return rdo;
			}else{
				throw new NoMatchException(patron, msg.getContent().toString());
			}
		}catch(IOException e){
			throw new NoMatchException(patron, e.getMessage());
		}catch(MessagingException e){
			throw new NoMatchException(patron, e.getMessage());
		}
			
	}
	
}
